## # 1.关于super的怨念
1. 其实之前一直觉得super很神奇,不会用,今天终于明白了,其实他就是回去调用父类的相关函数了,
2. super 和this 都是用来对构造函数而言,因为构造函数在构造函数无法直接调用;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Drawing (int i ) { super(i); } Drawing() { Drawing(5); } void test(String a) { } void test(int a) { test("aaa"); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Animal { protected void test(String a) { System.out.println(a); } } public class Mouse extends Animal { @Override protected void test(String a) { super.test(a); super.test("a"); super.test("b"); } }
|
## # 2.老生常谈的继承构造方法顺序;
1. 首先是雷打不动的父类先构造,其实相当于父类可以先给一遍值,子类再自己改;
2. 然后,比较新鲜的是,对象先创建,然后才是赋值;
3. 突然发现了父类如果是带参数的构造函数,那么子类必须存在带参构造函数,并且要有super,这也是我一直无法理解的地方了;
//this也可以,不过只能用一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Art { Art (int i) { System.out.println("Art Constructior"); } } public class Drawing extends Art { Drawing (int i) { super(i); System.out.println("Drawing Constructor"); } } public class Cartoon extends Drawing { Main main = new Main(); Cartoon(int i) { super(i); } public static void main(String arg[]) { Cartoon x = new Cartoon(1); } }
|
## # 3.关于代理
1. 这似乎是个新概念,也可能java课上略过了,我忽然发现这就是委托而已。。。;
简书上关于代理的内容
## # 4.关于重载和重写
1. 重载呢,简单地说,就是子类啊,父类啊,有一群类似的方法,子类可以调用父类的,反过来不行,但是重写就不一样了,因为他们名字完全相同,子类只能使用自己的,父类也只能使用自己的;
2. 相对的,我们大概也可以稍微把构造函数当成重写,不过只要父类构造函数带有参数,下面的构造函数不论带不带有参数,必须有super()方法;这样强制super可能是为了一定要调用父类方法;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Art { Art (int i) { System.out.println("Art Constructior"); } } public class Drawing extends Art { Drawing (String i) { super(5); System.out.println("Drawing Constructor"); } Drawing (int i ) { super(i); } Drawing() { super(5); } }
|
## # 5关于final
1. 对于对象来说,final只是表示引用恒定不变(数组属于对象);然而对象本身可以变化;
2. static +final 相当于最一般的C常量 通常大写 比如 VALUE_TEST = 1;
3. 作用嘛,大概就是防止改变之类的
4. final参数,这类参数,在函数中无法修改
5. final方法,防止修改;
6. final类,无法继承;
## # 初始化与类加载
1. .class文件在程序调用时才会加载,一般而言,就是构造函数,构造函数前面可以看成带有static关键字;
2. 程序运行时,首先是main方法所在的类,如果存在继承,就向上加载,一直加载到最顶层的积累,接着创建对象,然后从父类到子类,依次初始化对象